Skip to main content

BCard.dat

BCard.dat is pure clientside file. It is not needed on the server, unless as some kind of "helper". This file only carries how should given BCard string be displayed in the client.

Format

BCard.dat
#=============================================================
VNUM {BCardVNUM}
ICON {always -1, does't work sadly}
NAME {BCardCategoryCodeName}
DESC {BCardSub1DisplayType} {BCardSub2DisplayType} [...]
SUBJ1 {BCardSubject1CodeName}
SUBJ2 {BCardSubject2CodeName}
[...]
LIST1-1 {BCardList1-1CodeName}
LIST1-2 {BCardList1-2CodeName}
LIST2-1 {BCardList2-1CodeName}
LIST2-2 {BCardList2-2CodeName}
[...]
END
#=============================================================

There can be different amount of records, so i just used [...]. I don't think it's the limit, but currently in the client there is up to 5 records per BCard VNUM.

What is a BCard?

BCard is an orange effect present in skills, buffs, items, mobs and more. Each BCard VNUM is like a category. Let's look at an example:

BCard.dat
	VNUM	19
ICON -1
NAME Move
DESC 0 1 1 1 0
SUBJ1 Interrupts movement
SUBJ2 Changes movement speed.
SUBJ3 zts946e
SUBJ4 Increases/decreases movement speed.
SUBJ5 zts650e
LIST1-1 Movement impossible
LIST1-2 Movement impossible
LIST2-1 Movement speed is increased by %s%%.
LIST2-2 Movement speed is decreased by %s%%.
LIST3-1 Your movement speed is increased by %s while you are hidden.
LIST3-2 Your movement speed is decreased by %s while you are hidden.
LIST4-1 Movement speed is increased by %s.
LIST4-2 Movement speed is decreased by %s.
LIST5-1 Your speed is temporarily maximised.
LIST5-2 Your speed is temporarily maximised.
END
note

To make example more clear I replaced all zts... with actual translations

Every BCard with VNUM (BCardVNUM) 19 will be related to movement speed.

SUBJX BCardSubjectXCodeName is useless for the client. It only helps programmers while creating/using BCards I guess?

How typical BCard structure works?

BCards are used inside Item.data, Skill.dat, monster.dat etc. Below you can see typical structure for one BCard:

{BCardVNUM}	{EffectVal_1}	{EffectVal_2}	{BCardSub}	{Target}

That mean:

FieldDescription
BCardVNUMBcard VNUM
EffectVal_1EffectVal_1's sign (positive/negative) defines which Y to use (negative values will result in displaying LIST{X}-2, while positive will result in LIST{X}-1) Read more
EffectVal_2A value whose meaning varies according to DESC Read more
BCardSubDefines which X from LIST{X}-{Y} use (note that BCardSub starts from 0, while in LIST it starts from 1, so you have to add 1)
Target

DESC

Defines how should variables be put inside the string.

DESC valueDescription
0No variables inserted
1

One (first) variable used as a number, so the first %s will be replaced to abs(floor({EffectVal_1}/4)).

🔢
2

Two variables (both) are used as numbers.

  • First %s will be abs(floor({EffectVal_1}/4))
  • Second %s will be abs(floor({EffectVal_2}/4))
🔢🔢
3
  • First variable is number (abs(floor({EffectVal_1}/4))).
  • Second is Mob's VNUM and it will get this mob's name to display instead of a number.
warning

if BCard VNUM is equal to 46, both variables should be treated as mobs (this in the only exception)

🔢🐮
4
  • First variable is a number (abs(floor({EffectVal_1}/4))).
  • Second variable is treated as buff's VNUM and it will get this buff's name to display instead of a number.
🔢✨
5
  • First variable is treated as race's ID and it will get this race's name to display instead of a number
  • Second variable is a number (abs(floor({EffectVal_2}/4))).
🧝🔢
6
  • First variable is a number (abs(floor({EffectVal_1}/4))).
  • Second variable is treated as skill's VNUM and it will get this skill's name to display instead of a number.
🔢💪
tip

%% is just "%" escaped.

That mean Reduces remaining HP by %s%%. will be Reduces remaining HP by 20%.

Example

Example

Feelers (Vnum: 218) Feelers

[...]
BUFF 24 48 280 0 0 0 [...]
[...]

That mean:

buff field namevalueNote
BCardVNUM24
  1. Check VNUM 24 in BCard.dat
  2. Find
EffectVal_148Is
EffectVal_228048
BCardSub0
Target0
  1. Check VNUM 24 in BCard.dat

  2. Calculate X in LIST{X}-{Y}

    X = BCardSub + 1

  3. Calculate Y in LIST{X}-{Y}

    if buff.EffectVal_1 > 0:
    Y = 1
    else:
    Y = 2
  4. Get correct zts...

    In our case its LIST1-1 and zts318e (Increases damage against %s by %s.)

  5. Check DESC

    In our case X = 1 soo we need to read first variable in DESC. In our case it 5 which mean race + number

  6. Replace %s

    • replace first %s with race name
    • replace second %s with number (abs(floor({EffectVal_2}/4)))

    In our case Increases damage against High-level monster by 70.